package com.hj.email;

import cn.hutool.core.lang.Validator;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.hj.redis.RedisUtil;
import jakarta.mail.internet.MimeMessage;
import lombok.AllArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.mail.MailProperties;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

/**
 * @author hj
 * @Date 2023/4/26
 * @Description: 电子邮件相关 服务类 实现
 */
@Slf4j
@Service
@AllArgsConstructor
public class EmailService  {

    /**
     * Spring Boot 提供了一个发送邮件的简单抽象，使用的是下面这个接口，这里直接注入即可使用
     */
    private final JavaMailSender mailSender;
    /**
     * 邮件配置信息
     */
    private final MailProperties mailProperties;

    private final RedisUtil redisUtil;



    @SneakyThrows
    public Boolean sendEmailCode(String addressee, String subject, String redKey) {
        // 验证电子邮件地址是否正确
        Validator.validateTrue(Validator.isEmail(addressee), "DYY(2001|邮箱格式错误)");
        // 判断是否发送过验证码
        Validator.validateNull(redisUtil.get(redKey), "DYY(2004|验证码发送频繁)");
        // 生成验证码（长度为 4）
        String captcha = RandomUtil.randomNumbers(EmailConstant.CODE_SIZE);
        // 创建MimeMessage对象
        MimeMessage message = mailSender.createMimeMessage();
        // 创建SimpleMailMessage对象
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        // 邮件发送人
        helper.setFrom(StrUtil.format("{}<{}>", mailProperties.getJndiName(), mailProperties.getUsername()));
        // 邮件接收人
        helper.setTo(addressee);
        // 邮件主题
        helper.setSubject(subject);
        // 邮件内容
        helper.setText(StrUtil.format("您好<br/>您的验证码是: {}，如非本人操作，请忽略。", captcha), Boolean.TRUE);
        // 发送邮件
        mailSender.send(message);
        // 保存到Redis中（有效期为 60*5）
        redisUtil.set(redKey, captcha, EmailConstant.CODE_TIME);
        return Boolean.TRUE;
    }


    public Boolean checkEmailCode(String code, String redKey) {
        // 获取验证码
        String redisCode = redisUtil.get(redKey,String.class);
        // 判断验证码是否存在
        Validator.validateNotNull(redisCode, "DYY(2005|验证码过期或未发送)");
        // 验证是否正确
        Validator.validateEqual(code, redisCode, "DYY(2006|验证码不正确)");
        // 清除Redis缓存
        redisUtil.del(redKey);
        return Boolean.TRUE;
    }


}
